from haystack import indexes
from .models import Course


class CourseIndex(indexes.SearchIndex, indexes.Indexable):
    # 全文索引[可以根据配置，可以包括多个字段索引]
    # document=True 表示当前字段为全文索引
    # use_template=True 表示接下来haystack需要加载一个固定路径的html模板文件，让text与其他索引字段绑定映射关系
    text = indexes.CharField(document=True, use_template=False)
    # 普通索引[单字段，只能提供单个字段值的搜索，所以此处的声明更主要是为了提供给上面的text全文索引使用的]
    # es索引名 = indexes.索引数据类型(model_attr="ORM中的字段名")
    id = indexes.IntegerField(model_attr="id")
    coursename = indexes.CharField(model_attr="coursename")
    coursedesc = indexes.CharField(model_attr="coursedesc")
    price = indexes.DecimalField(model_attr="price")
    cover = indexes.CharField(model_attr="cover")
    content = indexes.CharField(model_attr="content")
    teacher = indexes.CharField(model_attr="teacher__name")

    # 指定与当前es索引模型对接的mysql的ORM模型
    def get_model(self):
        return Course

    # 当用户搜索es索引时，对应的提供的mysql数据集有哪些？
    #  using=None：表示该方法默认使用主搜索引擎
    def index_queryset(self, using=None):
        """
        重写index_queryset方法以自定义索引查询集。

        参数:
        - using: 可选参数，用于指定数据库别名。

        返回:
        - 返回一个查询集，该查询集包含了所有is_deleted字段为False且is_show字段为True的对象。
          这确保了只有那些未删除且应该显示的对象才会被索引。
        """
        # 获取模型并过滤出未删除且应该显示的对象
        return self.get_model().objects.filter(is_show=True)

    def prepare_text(self, obj):
        """
        根据对象的内容准备文本。

        该方法接收一个对象，该对象应包含课程名称（coursename）、课程描述（coursedesc）和内容（content）。
        它将这些属性组合成一个格式化的字符串，用于进一步的文本处理或显示。

        参数:
        - obj: 包含课程信息的对象，必须有coursename, coursedesc和content属性。

        返回:
        - 返回一个格式化的Unicode字符串，包含课程的名称、描述和内容。
        """
        return u"%s %s %s" % (obj.coursename, obj.coursedesc, obj.content)
